#!/bin/sh
set -e

TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"

setupenvironment
configarchitecture 'native'
configdpkgnoopchroot

# create a bunch of failures
createfailure() {
	setupsimplenativepackage "failure-$1" 'native' '1.0' 'unstable' 'Depends: dependee'
	BUILDDIR="incoming/failure-$1-1.0"
	echo '#!/bin/sh
exit 29' > "${BUILDDIR}/debian/$1"
	buildpackage "$BUILDDIR" 'unstable' 'main' 'native'
	rm -rf "$BUILDDIR"
}

buildsimplenativepackage 'dependee' 'native' '1.0' 'unstable'
createfailure 'preinst'
createfailure 'postinst'
createfailure 'prerm'
createfailure 'postrm'

setupaptarchive

# setup some pre- and post- invokes to check the output isn't garbled later
APTHOOK="${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apthook"
echo '#!/bin/sh
echo "$1: START"
echo "$1: MaiN"
echo "$1: ENd"' > "$APTHOOK"
chmod +x "$APTHOOK"
echo "DPKG::Pre-Invoke:: \"${APTHOOK} PRE\";
DPKG::Post-Invoke:: \"${APTHOOK} POST\";" > rootdir/etc/apt/apt.conf.d/99apthooks

testmyfailure() {
	local PROGRESS='rootdir/tmp/progress.log'
	exec 3> "$PROGRESS"
	testfailure "$@" -o APT::Status-Fd=3
	msgtest 'Test for failure message of maintainerscript in' 'console log'
	local TEST='rootdir/tmp/testfailure.output'
	if grep -q 'exit status 29' "$TEST"; then
		msgpass
	else
		cat "$TEST"
		msgfail
	fi
	msgtest 'Test for proper execution of invoke scripts in' 'console log'
	if grep -q '^PRE: START$' "$TEST" &&
		grep -q '^PRE: MaiN$' "$TEST" &&
		grep -q '^PRE: ENd$' "$TEST" &&
		grep -q '^POST: START$' "$TEST" &&
		grep -q '^POST: MaiN$' "$TEST" &&
		grep -q '^POST: ENd$' "$TEST"; then
		msgpass
	else
		cat "$TEST"
		msgfail
	fi
	msgtest 'Test for failure message of maintainerscript in' 'progress log'
	if grep -q '^pmerror:.\+exit status 29$' "$PROGRESS"; then
		msgpass
	else
		cat "$PROGRESS"
		msgfail
	fi
	testmarkedauto 'dependee'
}

testmyfailure aptget install failure-preinst -y
rm -f rootdir/var/lib/dpkg/status
testmyfailure aptget install failure-postinst -y
rm -f rootdir/var/lib/dpkg/status
testsuccess aptget install failure-prerm -y
testdpkginstalled failure-prerm
testmyfailure aptget purge failure-prerm -y
rm -f rootdir/var/lib/dpkg/status
testsuccess aptget install failure-postrm -y
testdpkginstalled failure-postrm
testmyfailure aptget purge failure-postrm -y

# FIXME: test with output going to a PTY as it usually does
if false; then
	rm -f rootdir/var/lib/dpkg/status
	apt install dependee -y || true
	apt install failure-postinst -y || true
fi
